/* eslint-disable eol-last */
/* eslint-disable space-before-function-paren */
/* eslint-disable indent */
export default class SocketService {
    // 单例设计模式
    static instance = null
    static get Instance() {
        if (!this.instance) {
            this.instance = new SocketService()
        }
        return this.instance
    }

    // 和服务端连接的socket对象
    ws = null
    callBackMapping = {}

    // 是否已经连接成功
    connected = false
    sendRetryCount = 0
    connectRetryCount = 0 // 重连次数, 重连次数越大, 下一次再发起重连的延时也就越长

    // 定义连接服务器的方法
    connect() {
        // 连接服务器
        if (!window.WebSocket) {
            return console.log('您的浏览器不支持WebSocket')
        }
        this.ws = new WebSocket('ws://localhost:9998')
        this.ws.onopen = () => {
            console.log('连接服务端成功。。')
            this.connected = true
            this.connectRetryCount = 0 // 连接成功之后, 重置重连次数
        }

        // 1. 服务器连接失败
        // 2. 连接成功，服务器关闭情况 也会调用 onclose 方法
        this.ws.onclose = () => {
            console.log('连接服务端失败。。')
            setTimeout(() => {
                this.connectRetryCount++
                    this.connect()
            }, 200 * this.connectRetryCount)
        }
        this.ws.onmessage = msg => {
            console.log('从服务端获取到了数据' + msg.data)
            const recvData = JSON.parse(msg.data)
            const socketType = recvData.socketType
                // 判断回调函数是否存在
            if (this.callBackMapping[socketType]) {
                const action = recvData.action
                if (action === 'getData') {
                    const realData = JSON.parse(recvData.data)
                    this.callBackMapping[socketType].call(this, realData)
                } else if (action === 'fullScreen') {
                    this.callBackMapping[socketType].call(this, recvData)
                } else if (action === 'themeChange') {
                    this.callBackMapping[socketType].call(this, recvData)
                }
            }
        }
    }

    // 存储回调函数   注册
    registerCallBack(socketType, callback) {
        this.callBackMapping[socketType] = callback
    }

    // 取消某一个回调函数
    unRegisterCallBack(socketType) {
        this.callBackMapping[socketType] = null
    }

    // 发送数据的方法
    send(data) {
        console.log('发送数据给服务器:')
        if (this.connected) {
            this.sendRetryCount = 0
            this.ws.send(JSON.stringify(data))
        } else {
            setTimeout(() => {
                    this.sendRetryCount++
                        this.send(data)
                }, 200 * this.sendRetryCount)
                // 发送数据尝试的次数越大, 则下一次连接的 延迟也就越长
        }
    }
}